package com.yupi.yupicturebackend.annotation;

import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import java.util.concurrent.TimeUnit;

/**
 * 限流注解
 * 用于控制接口访问频率
 * 
 * @author yupi
 */
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface RateLimit {

    /**
     * 限流key的前缀
     * @return key前缀
     */
    String key() default "";

    /**
     * 时间窗口内允许的最大请求数
     * @return 最大请求数
     */
    int count() default 10;

    /**
     * 时间窗口大小
     * @return 时间窗口
     */
    int time() default 60;

    /**
     * 时间单位
     * @return 时间单位
     */
    TimeUnit timeUnit() default TimeUnit.SECONDS;

    /**
     * 限流类型
     * @return 限流类型
     */
    LimitType limitType() default LimitType.IP;

    /**
     * 限流失败时的错误信息
     * @return 错误信息
     */
    String message() default "访问过于频繁，请稍后再试";

    /**
     * 限流类型枚举
     */
    enum LimitType {
        /**
         * 根据IP限流
         */
        IP,
        /**
         * 根据用户ID限流
         */
        USER,
        /**
         * 根据自定义key限流
         */
        CUSTOM
    }
}
